/**
 * @file    mjpeg_camera.hpp
 * @brief   mjpeg_camera功能类，初始化jpeg流，对外使用接口
 * @author  Haozhong Xu
 * @date    2025-05-27
 * @version 1.0
 * 
 * @note    声明初始化函数，并提供返回jpeg数据的接口
 */
#ifndef MJPEG_CAMERA_HPP
#define MJPEG_CAMERA_HPP

#include <iostream>
#include <string>
#include <vector>
#include "camera/camera_base.hpp"

/**
 * @class MJPEGCamera
 * @brief MJPEGCamera 摄像头功能类
 *
 * 对摄像头初始化，设置采集jpeg流，UpdateFrame采集一帧到成员变量中
 */
class MJPEGCamera : public CameraBase {
public:
    MJPEGCamera(const std::string &devicePath, int width, int height, bool autoInit = true)
        : CameraBase(devicePath, width, height) 
    {
        if (autoInit) {
            try {
                Init();
            } catch (const std::exception &e) {
                std::cerr << "程序异常终止" << e.what() <<std::endl;
            }

        }
    }
     
    ~MJPEGCamera() override;

    void Init() override;
    void Close() override;

    // 提供给 http 流的接口函数
    bool UpdateFrame();
    const std::vector<uint8_t> &GetFrame() const;

    // 保存一帧使用
    bool CaptureOneJPEGFrame(const std::string &filename);


private:
    bool InitDevice();
    bool InitFormat();
    bool InitMmap();
    bool StartStreaming();
    bool StopStreaming();

private:
    void *_mmapPtr[4] {};
    size_t _mmapSize[4] {};
    bool _streaming = false;
    std::vector<uint8_t> _jpegData;

};




#endif /* MJPEG_CAMERA_HPP */